package tas.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import tas.dao.DaoMantenimiento;
import tas.domain.AusentismoConcepto;
import tas.sql.ConectaDb;

public class DaoMantenimientoImpl implements DaoMantenimiento {

    private final ConectaDb db;

    public DaoMantenimientoImpl() {
        this.db = new ConectaDb();
    }

    @Override
   public List<Object[]> compensacionQry(Integer idestado){//, long numpag, long filsXpag) {
  //    public List<Object[]> compensacionQry(String filtro){//, long numpag, long filsXpag) {
        List<Object[]> list = null;
        String sql = //"SELECT * FROM " // adicional a consulta
               // + "(SELECT rownum rnum, a.* FROM ( " // adicional a consulta
                 "SELECT "
                + "COMPMOT.DESCRIPCIONCOMPENSACIONMOTIVO DESCRIPCION,"
                + "COMPMOT.PRIORIDAD PRIORIDAD,"
                + "est.descripcionestado ESTADO,"
                + "COMPMOT.IDCOMPENSACIONMOTIVO IDCOMMOT "
                + "FROM BDTAS.COMPENSACIONMOTIVO COMPMOT "
                + "left join BDTAS.estado est "
                + "on (COMPMOT.idestado=est.idestado) "
                + ((idestado != 0) ? "WHERE (COMPMOT.idestado=" + idestado + ")" : "");
              //  + ") a WHERE rownum <= ?) " // adicional a consulta
              //  + "WHERE rnum > ?"; // adicional a consulta

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
             //   ps.setLong(2, ((1 + numpag) * filsXpag));
              //  ps.setLong(3, (numpag * filsXpag));

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[4];

                    f[0] = rs.getObject(1); // DESCRIPCION
                    f[1] = rs.getObject(2); // PRIORIDAD
                    f[2] = rs.getObject(3); // ESTADO
                    f[3] = rs.getObject(4); // IDCOMMOT

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

  
    @Override
    public String compensacionIns(String descripcion, Integer prioridad) {
        String result = null;
        String sql0 = "SELECT UPPER(DESCRIPCIONCOMPENSACIONMOTIVO) FROM BDTAS.COMPENSACIONMOTIVO";

        String sql = "INSERT INTO BDTAS.COMPENSACIONMOTIVO("
                + "DESCRIPCIONCOMPENSACIONMOTIVO,"
                + "IDESTADO,"
                + "PRIORIDAD"
                + ") VALUES(?,?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // select
                PreparedStatement ps = cn.prepareStatement(sql0);
                ResultSet rs = ps.executeQuery();
                String aux1 = descripcion.toUpperCase();
                while (rs.next()) {
                    String aux2 = rs.getString(1);

                    if (aux1.compareTo(aux2) == 0) {
                        throw new SQLException("Imposible continuar, descripci&oacute;n ya existe.");
                    }
                }
                rs.close();
                ps.close();

                // insert
                ps = cn.prepareStatement(sql);
                ps.setString(1, descripcion);
                ps.setInt(2, 1); // IDESTADO == 1 -- Activo
                ps.setInt(3, prioridad);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("0 filas afectadas");
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public Object[] compensacionGet(Integer id) {
        Object[] fil = null;
        String sql = "SELECT "
                + "IDCOMPENSACIONMOTIVO,"
                + "DESCRIPCIONCOMPENSACIONMOTIVO,"
                + "idestado,"
                + "PRIORIDAD "
                + "FROM BDTAS.COMPENSACIONMOTIVO "
                + "WHERE IDCOMPENSACIONMOTIVO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, id);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    fil = new Object[4];

                    fil[0] = rs.getInt(1);
                    fil[1] = rs.getString(2);
                    fil[2] = rs.getInt(3);
                    fil[3] = rs.getInt(4);
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return fil;
    }

    @Override
    public String compensacionUpd(String descripcion, Integer id, Integer prioridad) {
        String result = null;
        String sql = "UPDATE BDTAS.COMPENSACIONMOTIVO "
                + "SET  DESCRIPCIONCOMPENSACIONMOTIVO=?,"
                + "PRIORIDAD=? "
                + "WHERE IDCOMPENSACIONMOTIVO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, descripcion);
                ps.setInt(2, prioridad);
                ps.setInt(3, id);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String compensacionUpdEst(Integer id, Integer idestado) {
        String result = null;
        String sql = "UPDATE BDTAS.COMPENSACIONMOTIVO "
                + "SET idestado=? "
                + "WHERE IDCOMPENSACIONMOTIVO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idestado);
                ps.setInt(2, id);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    //
    @Override
    public List<Object[]> ausentismoQry(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "AUSCON.DESCRIPCIONAUSENTISMOCONCEPTO,"
                + "AUSTIP.DESCRIPCIONAUSENTISMOTIPO,"
                + "AUSMOD.DESCRIPCIONAUSENTISMOMODALIDAD,"
                + "AUSUNI.DESCRIPCIONUNIDADAUSENTISMO,"
                + "EST.DESCRIPCIONESTADO,"
                + "AUSCON.IDAUSENTISMOCONCEPTO "
                + "FROM BDTAS.AUSENTISMOCONCEPTO AUSCON "
                + "LEFT JOIN BDTAS.AUSENTISMOMODALIDAD AUSMOD "
                + "ON ( AUSMOD.IDAUSENTISMOMODALIDAD = AUSCON.IDAUSENTISMOMODALIDAD) "
                + "LEFT JOIN BDTAS.AUSENTISMOTIPO AUSTIP "
                + "ON (AUSTIP.IDAUSENTISMOTIPO = AUSCON.IDAUSENTISMOTIPO) "
                + "LEFT JOIN BDTAS.AUSENTISMOUNIDAD AUSUNI "
                + "ON (AUSCON.IDUNIDADAUSENTISMO=AUSUNI.IDUNIDADAUSENTISMO) "
                + "LEFT JOIN BDTAS.ESTADO EST ON (AUSCON.IDESTADO=EST.IDESTADO) "
                + "WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                Statement st = cn.createStatement();
                ResultSet rs = st.executeQuery(sql);

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[6];

                    f[0] = rs.getObject(1); // DESCRIPCIONAUSENTISMOCONCEPTO
                    f[1] = rs.getObject(2); // DESCRIPCIONAUSENTISMOTIPO
                    f[2] = rs.getObject(3); // DESCRIPCIONAUSENTISMOMODALIDAD
                    f[3] = rs.getObject(4); // DESCRIPCIONUNIDADAUSENTISMO
                    f[4] = rs.getObject(5); // ESTADO
                    f[5] = rs.getObject(6); // IDAUSENTISMOCONCEPTO

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String ausentismoIns(AusentismoConcepto ac) {
        String result = null;
        String sql0 = "SELECT UPPER(DESCRIPCIONAUSENTISMOCONCEPTO) FROM BDTAS.AUSENTISMOCONCEPTO";

        String sql = "INSERT INTO BDTAS.AUSENTISMOCONCEPTO("
                + "DESCRIPCIONAUSENTISMOCONCEPTO,"
                + "IDESTADO,"
                + "IDAUSENTISMOMODALIDAD,"
                + "IDAUSENTISMOTIPO,"
                + "IDUNIDADAUSENTISMO"
                + ") VALUES(?,?,?,?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // select
                PreparedStatement ps = cn.prepareStatement(sql0);
                ResultSet rs = ps.executeQuery();
                String aux1 = ac.getDescripcionausentismoconcepto().toUpperCase();
                while (rs.next()) {
                    String aux2 = rs.getString(1);

                    if (aux1.compareTo(aux2) == 0) {
                        throw new SQLException("Imposible continuar, descripci&oacute;n ya existe.");
                    }
                }
                rs.close();
                ps.close();

                // insert
                ps = cn.prepareStatement(sql);
                ps.setString(1, ac.getDescripcionausentismoconcepto());
                ps.setInt(2, 1); // idestado
                ps.setInt(3, ac.getIdausentismomodalidad());
                ps.setInt(4, ac.getIdausentismotipo());
                ps.setInt(5, ac.getIdunidad());

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public AusentismoConcepto ausentismoGet(Integer id) {
        AusentismoConcepto ac = null;
        String sql = "SELECT "
                + "IDAUSENTISMOCONCEPTO,"
                + "DESCRIPCIONAUSENTISMOCONCEPTO,"
                + "IDAUSENTISMOMODALIDAD,"
                + "IDAUSENTISMOTIPO,"
                + "IDESTADO,"
                + "IDUNIDADAUSENTISMO "
                + "FROM BDTAS.AUSENTISMOCONCEPTO "
                + "WHERE IDAUSENTISMOCONCEPTO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, id);

                ResultSet rs = ps.executeQuery();

                if (rs.next()) {
                    ac = new AusentismoConcepto();

                    ac.setIdausentismoconcepto(rs.getInt(1));
                    ac.setDescripcionausentismoconcepto(rs.getString(2));
                    ac.setIdausentismomodalidad(rs.getInt(3));
                    ac.setIdausentismotipo(rs.getInt(4));
                    ac.setIdestado(rs.getInt(5));
                    ac.setIdunidad(rs.getInt(6));
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return ac;
    }

    @Override
    public String ausentismoUpd(AusentismoConcepto ac) {
        String result = null;
        String sql = "UPDATE BDTAS.AUSENTISMOCONCEPTO "
                + "SET DESCRIPCIONAUSENTISMOCONCEPTO=?  "
                + ", IDAUSENTISMOMODALIDAD=? "
                + ", IDAUSENTISMOTIPO=? "
                + ", IDUNIDADAUSENTISMO=? "
                + " WHERE IDAUSENTISMOCONCEPTO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, ac.getDescripcionausentismoconcepto());
                ps.setInt(2, ac.getIdausentismomodalidad());
                ps.setInt(3, ac.getIdausentismotipo());
                ps.setInt(4, ac.getIdunidad());
                ps.setInt(5, ac.getIdausentismoconcepto());

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String ausentismoUpdEst(Integer id, Integer idestado) {
        String result = null;
        String sql = "UPDATE BDTAS.AUSENTISMOCONCEPTO "
                + "SET idestado=? "
                + "WHERE IDAUSENTISMOCONCEPTO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idestado);
                ps.setInt(2, id);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> feriadosQry(Integer idestado) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "TO_CHAR(FERCAL.IDDIAMES,'DD/MM/YYYY') FECHA,"
                + "FERCAL.DESCRIPCION,"
                + "EST.DESCRIPCIONESTADO ESTADO, "
                + "FERCAL.IDDIAMES "
                + "FROM BDTAS.FERIADOCALENDARIO FERCAL "
                + "LEFT JOIN BDTAS.ESTADO EST "
                + "ON (EST.IDESTADO=FERCAL.IDESTADO) "
                + "WHERE FERCAL.IDESTADO=? "
                + "ORDER BY 4";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idestado);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[3];

                    f[0] = rs.getObject(1); // FECHA
                    f[1] = rs.getObject(2); // DESCRIPCION
                    f[2] = rs.getObject(3); // ESTADO

                    list.add(f);

                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String feriadosIns(String fecha, String descripcion) {
        String result = null;
        String sql0 = "SELECT COUNT(*) "
                + "FROM BDTAS.FERIADOCALENDARIO FERCAL "
                + "WHERE TO_CHAR(FERCAL.IDDIAMES,'DD/MM/YYYY')=? ";

        String sql = "INSERT INTO BDTAS.FERIADOCALENDARIO("
                + "IDDIAMES,"
                + "DESCRIPCION,"
                + "IDESTADO"
                + ") VALUES(TO_DATE(?, 'DDMMYYYY'),?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // select
                PreparedStatement ps = cn.prepareStatement(sql0);
                ps.setString(1, fecha);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int ctos = rs.getInt(1);

                    if (ctos > 0) {
                        throw new SQLException("Feriado Calendario ya Existe");
                    }
                }
                rs.close();
                ps.close();

                String[] f = fecha.split("/"); // f[0]==dd, f[1]==mm, f[2]==yyyy

                // insert
                ps = cn.prepareStatement(sql);

                String aux = f[0] + f[1] + f[2];
                ps.setString(1, aux);

                ps.setString(2, descripcion);
                ps.setInt(3, 1);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo registrar Feriado");
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String feriadosUpd(String fecha, String descripcion) {
        String result = null;
        String sql = "UPDATE BDTAS.FERIADOCALENDARIO "
                + "SET DESCRIPCION='" + descripcion + "'"
                + " WHERE TO_CHAR(IDDIAMES,'DD/MM/YYYY')='" + fecha + "' ";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                //  String[] f = fecha.split("/"); // f[0]==dd, f[1]==mm

                PreparedStatement ps = cn.prepareStatement(sql);

                int ctos = ps.executeUpdate();

                if (ctos == 0) {
                    throw new SQLException("No se pudo actualizar Feriado");
                }
                ps.close();

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String feriadosEst(String fecha, Integer estado) {
        String result = null;

        estado = ((estado == 1) ? 2 : 1);

        String sql = "UPDATE BDTAS.FERIADOCALENDARIO "
                + " SET IDESTADO=" + estado
                + " WHERE TO_CHAR(IDDIAMES,'DD/MM/YYYY')= '" + fecha + "'";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo actualizar Feriado");
                }
                ps.close();

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> diasNoLbarablesQry(String anno, String uejecutora, String corte, Integer estado) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "DIALAB.IDAÑO,"
                + "DIALAB.IDUNIDADEJECUTORA,"
                + "DIALAB.IDCORTE,"
                + "TO_CHAR(DIALAB.IDFECHA, 'DD/MM/YYYY' ) FECHA,"
                + "DIALAB.DESCRIPCION,"
                + "TIPO.DESCRIPCION TIPO,"
                + "EST.DESCRIPCIONESTADO,"
                + "DIALAB.IDESTADO,"
                + "DIALAB.IDFECHA,"
                + "DIALAB.IDDIANOLABORABLETIPO CODIGOTIPO "
                + "FROM BDTAS.DIANOLABORABLEXCORTE DIALAB "
                + "LEFT JOIN BDTAS.DIANOLABORABLETIPO TIPO "
                + "ON (TIPO.IDDIANOLABORABLETIPO = DIALAB.IDDIANOLABORABLETIPO) "
                + "LEFT JOIN BDTAS.ESTADO EST "
                + "ON (EST.IDESTADO = DIALAB.IDESTADO) "
                + "WHERE DIALAB.IDESTADO=? "
                + "AND  DIALAB.IDAÑO=? "
                + "AND DIALAB.IDUNIDADEJECUTORA=? "
                + "AND DIALAB.IDCORTE=? "
                + "order by 9";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, estado);
                ps.setString(2, anno);
                ps.setString(3, uejecutora);
                ps.setString(4, corte);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[10];

                    f[0] = rs.getObject(1); // IDAÑO
                    f[1] = rs.getObject(2); // IDUNIDADEJECUTORA
                    f[2] = rs.getObject(3); // IDCORTE
                    f[3] = rs.getObject(4); // FECHA
                    f[4] = rs.getObject(5); // DESCRIPCION
                    f[5] = rs.getObject(6); // TIPO
                    f[6] = rs.getObject(7); // DESCRIPCIONESTADO
                    f[7] = rs.getObject(8); // IDESTADO
                    f[8] = rs.getObject(9); // IDFECHA
                    f[9] = rs.getObject(10); // CODIGOTIPO

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String diasNoLbarablesIns(String anno, String uejecutora, String corte, String fecha, Integer tipo, String descripcion) {
        String result = null;
        String sql0 = "SELECT COUNT(*) "
                + "FROM BDTAS.DIANOLABORABLEXCORTE "
                + "WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE=? "
                + "AND TO_CHAR(IDFECHA,'DD/MM/YYYY')=?";

        String sql = "INSERT INTO BDTAS.DIANOLABORABLEXCORTE("
                + "IDAÑO,"
                + "IDUNIDADEJECUTORA,"
                + "IDCORTE,"
                + "IDFECHA,"
                + "DESCRIPCION,"
                + "IDDIANOLABORABLETIPO,"
                + "IDESTADO"
                + ") VALUES(?,?,?,TO_DATE(?, 'DDMMYYYY'),?,?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // select
                PreparedStatement ps = cn.prepareStatement(sql0);
                ps.setString(1, anno);
                ps.setString(2, uejecutora);
                ps.setString(3, corte);
                ps.setString(4, fecha);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int ctos = rs.getInt(1);

                    if (ctos > 0) {
                        throw new SQLException("Dia No Laborable ya Existe");
                    }
                }
                rs.close();
                ps.close();

                // insert
                String[] f = fecha.split("/"); // f[0]==dd, f[1]==mm, f[2]==yyyy

                ps = cn.prepareStatement(sql);
                ps.setString(1, anno);
                ps.setString(2, uejecutora);
                ps.setString(3, corte);
                String aux = f[0] + f[1] + f[2];
                ps.setString(4, aux);
                ps.setString(5, descripcion);
                ps.setInt(6, tipo);
                ps.setInt(7, 1); // estado

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo registrar Feriado");
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String diasNoLbarablesUpd(String anno, String uejecutora, String corte, String fecha, Integer tipo, String descripcion) {
        String result = null;
        String sql = "UPDATE BDTAS.DIANOLABORABLEXCORTE "
                + "SET IDDIANOLABORABLETIPO=?,"
                + "DESCRIPCION=? "
                + "WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE =? "
                + "AND TO_CHAR(IDFECHA,'DD/MM/YYYY')=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, tipo);
                ps.setString(2, descripcion);
                ps.setString(3, anno);
                ps.setString(4, uejecutora);
                ps.setString(5, corte);
                ps.setString(6, fecha);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public String diasNoLbarablesEst(String anno, String uejecutora, String corte, String fecha, Integer estado) {
        String result = null;
        String sql = "UPDATE BDTAS.DIANOLABORABLEXCORTE "
                + "SET IDESTADO=? "
                + "WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE =? "
                + "AND TO_CHAR(IDFECHA,'DD/MM/YYYY')=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, ((estado == 1) ? 2 : 1));
                ps.setString(2, anno);
                ps.setString(3, uejecutora);
                ps.setString(4, corte);
                ps.setString(5, fecha);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresFlagQry(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT DISTINCT "
                + "TRA.IDTRABAJADOR,"
                + "NVL(TRAFLAG.IDFLAGEXOMARCA,2) IDFLAGACTUAL,"
                + "VIS_TRA.IDESTADOSIGA IDESTADO,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR,"
                + "VIS_TRA.NUMERODOCUMENTOIDENTIDAD,"
                + "NVL(FLAGEXON.DESCRIPCION, 'NO') FLAG,"
                + "VIS_DEP.DESCRIPCIONDEPENDENCIA DEPENDENCIA,"
                + "VIS_AREA.DESCRIPCIONAREAS AREAS,"
                + "CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO "
                + "FROM BDTAS.TRABAJADOR TRA LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT) "
                + "LEFT JOIN BDTAS.TRABAJADORFLAGEXONERAMARCA TRAFLAG "
                + "ON (TRAFLAG.IDTRABAJADOR = TRA.IDTRABAJADOR) "
                + "AND ( TRAFLAG.IDESTADO=1) "
                + "left join BDTAS.FLAGEXONERAMARCACION FLAGEXON "
                + "ON (TRAFLAG.IDFLAGEXOMARCA = FLAGEXON.IDFLAGEXOMARCA) "
                + "WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                Statement st = cn.createStatement();
                ResultSet rs = st.executeQuery(sql);

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[9];

                    f[0] = rs.getObject(1); // IDTRABAJADOR
                    f[1] = rs.getObject(2); // IDFLAGACTUAL
                    f[2] = rs.getObject(3); // IDESTADO
                    f[3] = rs.getObject(4); // TRABAJADOR
                    f[4] = rs.getObject(5); // NUMERODOCUMENTOIDENTIDAD
                    f[5] = rs.getObject(6); // FLAG
                    f[6] = rs.getObject(7); // DEPENDENCIA
                    f[7] = rs.getObject(8); // AREAS
                    f[8] = rs.getObject(9); // ESTADO

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String trabajadoresFlag(Integer idtrabajador, Integer flag) {
        String result = null;
        String sql1 = "UPDATE BDTAS.TRABAJADORFLAGEXONERAMARCA "
                + "SET IDESTADO=2 WHERE IDTRABAJADOR=?";

        String sql2 = "SELECT NVL(MAX(IDCORRELATIVO),0) + 1 CORRELATIVO "
                + "FROM BDTAS.TRABAJADORFLAGEXONERAMARCA "
                + "WHERE IDTRABAJADOR=?";

        String sql3 = "INSERT INTO BDTAS.TRABAJADORFLAGEXONERAMARCA "
                + "(IDTRABAJADOR, IDCORRELATIVO, FECHA, IDFLAGEXOMARCA, IDESTADO) "
                + "VALUES("
                + "?," // IDTRABAJADOR
                + "?," // IDCORRELATIVO 
                + "(SELECT SYSDATE FROM DUAL),"
                + "?," // flag
                + "1" // ESTADO 
                + ")";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // update
                PreparedStatement ps = cn.prepareStatement(sql1);
                ps.setInt(1, idtrabajador);

                ps.executeUpdate();
                /*
                 int ctos = ps.executeUpdate();
                 if (ctos == 0) {
                 throw new SQLException("No se pudo actualizar estado");
                 }
                 */
                ps.close();

                // correlativo
                ps = cn.prepareStatement(sql2);
                ps.setInt(1, idtrabajador);

                ResultSet rs = ps.executeQuery();
                Integer idcorrelativo = null;
                if (rs.next()) {
                    idcorrelativo = rs.getInt(1);
                } else {
                    throw new SQLException("No se pudo obtener correlativo");
                }
                rs.close();
                ps.close();

                // insert
                ps = cn.prepareStatement(sql3);
                ps.setInt(1, idtrabajador);
                ps.setInt(2, idcorrelativo);
                ps.setInt(3, (flag == 1 ? 2 : 1));

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo insertar Flag");
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresFlagCon(Integer idtrabajador) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "TRAFLAG.FECHA FECHA,"
                + "FLAGEXON.DESCRIPCION FLAG,"
                + "EST.DESCRIPCIONESTADO ESTADO "
                + "FROM BDTAS.TRABAJADORFLAGEXONERAMARCA TRAFLAG "
                + "LEFT JOIN BDTAS.FLAGEXONERAMARCACION FLAGEXON "
                + "ON (TRAFLAG.IDFLAGEXOMARCA = FLAGEXON.IDFLAGEXOMARCA) "
                + "LEFT JOIN  BDTAS.ESTADO EST "
                + "ON (EST.IDESTADO = TRAFLAG.IDESTADO) "
                + "WHERE traflag.idtrabajador=? "
                + "ORDER BY 1 DESC";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idtrabajador);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[3];

                    f[0] = rs.getObject(1); // FECHA
                    f[1] = rs.getObject(2); // FLAG
                    f[2] = rs.getObject(3); // ESTADO

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

}
